package com.atguigu.gulimall.seckill.schedule;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * @Author : Jungle
 * @Description :
 *
 *
 * 定时任务：
     *  1、@EnableScheduling 开启定时任务
     *  2、@Scheduled 开启定时任务
 *      3、自动配置类  TaskSchedulingAutoConfiguration
 *异步任务：
 *      1、@EnableAsync 开启异步任务功能
 *      2、@Async  给希望执行的方法上标注
 *      3、自动配置类 TaskExecutionAutoConfiguration 属性绑定在 TaskExecutionProperties
 */
@Slf4j
@Component
//@EnableAsync
//@EnableScheduling
public class HelloSchedule {
    /**
     * spring整合中和 quartz-scheduler区别
     * 1、spring中6位组成，不允许第七位的年
     * 2、在周几的位置  1-7 代表 MON-SUN
     * 3、定时任务不应该阻塞。默认是阻塞的，三种解决方式，采用第三种
     *      1）、可以让业务以异步方式执行，自己提交到线程池中
     *                 CompletableFuture.runAsync(() -> xxxService.hello(), excutor);
     *
     *       2）、支持定时任务线程池  设置：@ConfigurationProperties
     *            spring.task.scheduling.pool.size=5  当前版本不顶用
     *
     *       3）、让定时任务异步执行
     *
     *      解决：使用异步+定时任务来完成任务时候，不阻塞的功能
     */
    @Async
    @Scheduled(cron = "* * * ? * 1")
    public void hello(){
       log.info("hello ==>");
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
